package com.jhy.review.yihuo;

/**
 * @author go_jhy
 * @create 2022/6/7 - 下午 3:48
 * 异或运算的例子
 */
public class EvenTimesOddTimes {
    //一个数组中有一种数出现了奇数次，其他数都出现了偶数次，怎么找到这一个数
    public static void printOddTimesNum1(int[] arr) {
        int eor = 0;
        for (int cur : arr) {
            eor ^= cur;
        }
        System.out.println(eor);
    }

    //一个数组中有两种数出现了奇数次，其他数都出现了偶数次，怎么找到这两个数
    public static void printOddTimeNum2(int[] arr){
        int eor = 0;
        for (int cur : arr) {
            eor ^= cur;
        }
        /*
       两个数出现了奇数次 那么结果一定是 a ^ b
       且 a ^ b= eor 一定 不为0，因为两个数不相等
       故a和b至少有一位不相等
       故我们可以按照这一位来将这个数组分为两个区域
         */
        // 取出最右边的1
        int eorRight = eor & ( ~eor + 1);
        System.out.println("最左边的1:" + eorRight);
        int eor1 = 0;
        for(int cur: arr){
            //按照这一位来进行划分 这里的条件可以为1也可以为0
            if((cur & eorRight) == 0 ){
                eor1 ^= cur;
            }
        }
        System.out.println(eor1);
        //算出来一个素，那么例外一个数也出来了。
        int a = eor ^ eor1;
        System.out.println(a);
    }

    public static void main(String[] args) {
        int a = 5;
        int b = 7;

        a = a ^ b;
        b = a ^ b;
        a = a ^ b;

        System.out.println(a);
        System.out.println(b);

        int[] arr1 = { 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1 };

        printOddTimesNum1(arr1);

        int[] arr2 = {2,3,1,1,4,4,4,4};
        printOddTimeNum2(arr2);

    }



}
